/*
  bmp reader header

*/

#ifndef BMP_READER_H
#define BMP_READER_H

/*  Выравнивание для структур соответствует 1 байту,
    так как структуры считываются напрямую из файла.
    Между блоками данных не должно быть промежутков.
*/
#pragma pack(1)
typedef struct {
  unsigned char ID[2];
  unsigned int size;
  unsigned char unused[4];
  unsigned int offset;
} BMPHeader;

typedef struct {
  unsigned int bytes_in_header;
  unsigned int width;
  unsigned int height;
  unsigned short planes;
  unsigned short bpp;
  unsigned int comp;
  unsigned int size_raw;
  unsigned int pwidth;
  unsigned int pheight;
  unsigned int colors;
  unsigned int impcolors;
} DIBHeader;

typedef struct {
  unsigned int Red;
  unsigned int Green;
  unsigned int Blue;
  unsigned int Alpha;
} BITFields;
#pragma pop

/* Структура, полностью описывающая все необходимые данные BMP-файла */
typedef struct {
  BMPHeader hdr;
  DIBHeader dib;
  BITFields bf;
  char* data;
} BMPInfo;

BMPInfo* bmp_load(char* fname); /* Загрузка BMP-файла */
void bmp_free(BMPInfo* info); /* Освобождение памяти, соотвующей загруженному
                                файлу */
char* bmp_get_err(); /* Получение сообщения об ошибке чтения
                        (при возникновении) */

#endif
